package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;
import analiseSemantica.Tipos.TipoSemantico;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSemantica.estruturadedados.Identificador;
import analiseSemantica.estruturadedados.Token;
import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraElementoVar extends Regra{

    protected static Regra instancia;
    protected static String estrutura= " <elemento_var> ::= identificador";


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraElementoVar() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraElementoVar getInstance() {
        if (instancia == null) {
            instancia = new RegraElementoVar();
        }
        return (RegraElementoVar) instancia;
    }

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

    	TiposSemanticos tipos = new TiposSemanticos();

    	LinkToken identificador = listaTokens.getFirst();
    	reconheceToken(listaTokens, "identificador", estrutura);

    	Token id = AnalisadorSintatico.escopoatual.find(identificador.getLexema());
    	Identificador id2 = (Identificador)id;
    	if(id == null || !(id instanceof Identificador)){
    		AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Identificador "+identificador.getLexema()+" nao declarado", identificador.getLinha()));
    		tipos = null;
    	}else{
    		tipos.addTipos(new TipoSemantico(id2.getTipo(), identificador.getLinha()));
    	}

    	return tipos;
    }



    @Override
    protected void setPrimeiro() {
        this.primeiro.add("identificador");
    }
}
